<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link type="text/css" rel="stylesheet" href="styles.css">
  <script type="text/javascript" src="config.js"></script>
</head>

<body>
  <h1 class="h">3. 高级花式索引</h1>
  <p>基础索引返回的是视图，而高级索引<strong>总是返回副本</strong>。</p>
  <dl>
    <dt>1. 整数数组索引</dt>
    <dd>
      使用整数数组来索引，可以一次性获取任意位置、任意顺序、甚至重复的元素。
      <pre><code>a = np.arange(12)**2 # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121]

# 用一个整数列表索引
indices = [1, 3, 5, 7]
print(a[indices]) # 获取第1,3,5,7个元素 -> [1, 9, 25, 49]

# 用一个整数数组索引
indices = np.array([[1, 2], [9, 10]])
print(a[indices]) # 输出的形状与indices数组相同，其值是a中对应位置的元素
# [[ 1  4]
#  [81 100]]

# 用于修改值
a[[1, 3, 5]] = 0 # 将第1,3,5个位置的值设为0
print(a)

# 获取对角线元素
matrix = np.arange(16).reshape(4, 4)
diag_indices = [0, 1, 2, 3]
diagonal = matrix[diag_indices, diag_indices] # 同时提供行索引和列索引
print(diagonal) # [ 0, 5, 10, 15 ]</code></pre>
    </dd>
    <dt>2. 布尔数组索引</dt>
    <dd>
      使用一个布尔数组（通常是条件表达式的结果）作为索引。
      <pre><code>a = np.arange(12).reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 找出所有大于5的元素
print(a[a > 5]) # [ 6  7  8  9 10 11]

# 找出所有大于5的偶数 (使用位运算符 & | ~ 而不是 and or not)
condition = (a > 5) & (a % 2 == 0)
print(a[condition]) # [ 6  8 10]

# 将满足条件的值替换为特定值
a[a % 2 == 0] = -1 # 将所有偶数替换为-1
print(a)
# [[-1  1 -1  3]
#  [-1  5 -1  7]
#  [-1  9 -1 11]]</code></pre>
    </dd>
  </dl>
</body>

</html>